package br.com.foxinline.servico.ep;

import br.com.foxinline.enums.TipoPessoa;
import br.com.foxinline.modelo.Anexo;
import br.com.foxinline.modelo.ep.EscrituraSDI;
import br.com.foxinline.modelo.ep.Parte;
import br.com.foxinline.modelo.ep.SeloEP;
import br.com.foxinline.servico.ServicoGenerico;
import br.com.foxinline.utilitario.Caracteres;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author cadomeireles
 */
@Stateless
public class EscrituraSDIServico extends ServicoGenerico<EscrituraSDI> {

    public EscrituraSDIServico() {
        super(EscrituraSDI.class);
    }

    public List<EscrituraSDI> pesquisar(EscrituraSDI escritura, Parte parte) {
        String sql = "select escritura from EscrituraSDI escritura";

        boolean tipoPessoa = false;

        if (parte.getPessoa().getNome() != null && !parte.getPessoa().getNome().isEmpty()
                || parte.getPessoa().getCpf() != null && !parte.getPessoa().getCpf().isEmpty()
                || parte.getPessoa().getCnpj() != null && !parte.getPessoa().getCnpj().isEmpty()
                || parte.getPessoa().getOAB() != null && !parte.getPessoa().getOAB().isEmpty()
                || parte.getQualidade() != null) {
            sql += " join escritura.partes partes where partes.pessoa.tipoPessoa = :tipoPessoa and escritura.ativo = true";
            tipoPessoa = true;
        } else {
            sql += " where escritura.ativo = true";
        }

        if (parte.getPessoa().getNome() != null && !parte.getPessoa().getNome().isEmpty()) {
            sql += " and lower(partes.pessoa.nome) like '%" + parte.getPessoa().getNome().toLowerCase() + "%'";
        }

        if (parte.getPessoa().getCpf() != null && !parte.getPessoa().getCpf().isEmpty()) {
            sql += " and partes.pessoa.cpf like '%" + Caracteres.removecaracter(parte.getPessoa().getCpf()) + "%'";
        }

        if (parte.getPessoa().getCnpj() != null && !parte.getPessoa().getCnpj().isEmpty()) {
            sql += " and partes.pessoa.cnpj like '%" + Caracteres.removecaracter(parte.getPessoa().getCnpj()) + "%'";
        }

        if (parte.getPessoa().getOAB() != null && !parte.getPessoa().getOAB().isEmpty()) {
            sql += " and partes.pessoa.OAB like '%" + parte.getPessoa().getOAB() + "%'";
        }

        if (parte.getQualidade() != null) {
            sql += " and partes.qualidade = :qualidade";
        }

        if (escritura.getNumero() != null && !escritura.getNumero().isEmpty()) {
            sql += " and escritura.numero like '%" + escritura.getNumero() + "%'";
        }

        if (escritura.getAtoTipoEP() != null) {
            sql += " and escritura.atoTipoEP = :tipo";
        }

        if (escritura.getDataAto() != null) {
            sql += " and escritura.dataAto = :data";
        }

        if (escritura.getRegimeBens() != null) {
            sql += " and escritura.regimeBens = :regimeBens";
        }

        if (escritura.getDataCasamento() != null) {
            sql += " and escritura.dataCasamento = :dataCasamento";
        }

        if (escritura.getLivro() != null && !escritura.getLivro().isEmpty()) {
            sql += " and escritura.livro like '%" + escritura.getLivro() + "%'";
        }

        if (escritura.getLivroComplemento() != null && !escritura.getLivroComplemento().isEmpty()) {
            sql += " and escritura.livroComplemento like '%" + escritura.getLivroComplemento() + "%'";
        }

        if (escritura.getFolha() != null && !escritura.getFolha().isEmpty()) {
            sql += " and escritura.folha like '%" + escritura.getFolha() + "%'";
        }

        if (escritura.getFolhaComplemento() != null && !escritura.getFolhaComplemento().isEmpty()) {
            sql += " and escritura.folhaComplemento like '%" + escritura.getFolhaComplemento() + "%'";
        }

        Query query = getEntityManager().createQuery(sql);

        if (escritura.getAtoTipoEP() != null) {
            query.setParameter("tipo", escritura.getAtoTipoEP());
        }

        if (escritura.getDataAto() != null) {
            query.setParameter("data", escritura.getDataAto());
        }

        if (escritura.getRegimeBens() != null) {
            query.setParameter("regimeBens", escritura.getRegimeBens());
        }

        if (escritura.getDataCasamento() != null) {
            query.setParameter("dataCasamento", escritura.getDataCasamento());
        }

        if (parte.getQualidade() != null) {
            query.setParameter("qualidade", parte.getQualidade());
        }

        if (tipoPessoa) {
            query.setParameter("tipoPessoa", parte.getPessoa().getTipoPessoa());
        }

        return query.getResultList();
    }

    public List<Parte> obterPartes(EscrituraSDI escritura) {

        String sql = "select escritura.partes from EscrituraSDI escritura where escritura.ativo = true and escritura = :escritura";

        Query query = getEntityManager().createQuery(sql);

        if (escritura != null && escritura.getId() != null) {
            query.setParameter("escritura", escritura);
        }

        return query.getResultList();
    }

    public List<SeloEP> obterSelos(EscrituraSDI escritura) {

        String sql = "select escritura.selosEP from EscrituraSDI escritura where escritura.ativo = true and escritura = :escritura";

        Query query = getEntityManager().createQuery(sql);

        if (escritura != null && escritura.getId() != null) {
            query.setParameter("escritura", escritura);
        }

        return query.getResultList();
    }

    public List<Anexo> obterAnexos(EscrituraSDI escritura) {
        String sql = "select escritura.anexos from EscrituraSDI escritura where escritura.ativo = true and escritura = :escritura";

        Query query = getEntityManager().createQuery(sql);

        if (escritura.getId() != null) {
            query.setParameter("escritura", escritura);
        }

        return query.getResultList();
    }

    public List<EscrituraSDI> obterEscrituras(Date dataInicial, Date dataFinal) {
        String sql = "select escritura from EscrituraSDI escritura where escritura.ativo = true and escritura.dataCadastro between :dataInicial and :dataFinal";

        Query query = getEntityManager().createQuery(sql);

        query.setParameter("dataInicial", dataInicial);
        query.setParameter("dataFinal", dataFinal);        

        return query.getResultList();
    }

    public void exportarCENSEC(Date dataInicial, Date dataFinal) throws IOException {

        BufferedReader reader = new BufferedReader(new FileReader("/home/cadomeireles/Development/FoxInLine/projects/Notario/Notario-ejb/src/java/br/com/foxinline/utilitario/CESDI_layout.xml"));

        DateFormat fileNameDateFormat = new SimpleDateFormat("dd-MM-yyyy");
        
        List<EscrituraSDI> escrituras = obterEscrituras(dataInicial, dataFinal);

        String fileName = String.format("CENSEC_CESDI_%s_%s_(%s).xml", fileNameDateFormat.format(dataInicial), fileNameDateFormat.format(dataFinal), escrituras.size());

        BufferedWriter file = new BufferedWriter(new FileWriter(new File("/home/cadomeireles/Development/FoxInLine/Docs/Notário/CENSEC/" + fileName)));

        String line;

        while ((line = reader.readLine()) != null) {
            file.write(line + "\n");
        }

        StringBuilder texto = new StringBuilder();

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        Pattern pattern = Pattern.compile("(\\D*$)");

        for (EscrituraSDI escritura : escrituras) {

            for (Parte parte : obterPartes(escritura)) {

                texto.append("\t<AtoCesdi>\n");

                texto.append("\t\t<TipoAtoCesdi>").append(escritura.getAtoTipoEP().getCodigo()).append("</TipoAtoCesdi>\n");

                texto.append("\t\t<DataAto>").append(dateFormat.format(escritura.getDataAto())).append("</DataAto>\n");

                texto.append("\t\t<Livro>").append(escritura.getLivro()).append("</Livro>\n");

                String livroComplemento = "";
                if (escritura.getLivroComplemento() != null && !escritura.getLivroComplemento().isEmpty()) {
                    Matcher matcherLivroReferenteComplemento = pattern.matcher(escritura.getLivroComplemento());
                    if (matcherLivroReferenteComplemento.find()) {
                        livroComplemento = matcherLivroReferenteComplemento.group();
                    }
                }

                texto.append("\t\t<LivroComplemento>").append(livroComplemento).append("</LivroComplemento>\n");

                texto.append("\t\t<Folha>").append(escritura.getFolha()).append("</Folha>\n");

                String folhaComplemento = "";
                if (escritura.getFolhaComplemento() != null && !escritura.getFolhaComplemento().isEmpty()) {
                    Matcher matcherFolhaReferenteComplemento = pattern.matcher(escritura.getFolhaComplemento());
                    if (matcherFolhaReferenteComplemento.find()) {
                        folhaComplemento = matcherFolhaReferenteComplemento.group();
                    }
                }

                texto.append("\t\t<FolhaComplemento>").append(folhaComplemento).append("</FolhaComplemento>\n");

                String dataCasamento = "";
                if (escritura.getDataCasamento() != null) {
                    dataCasamento = dateFormat.format(escritura.getDataCasamento());
                }

                texto.append("\t\t<DataCasamento>").append(dataCasamento).append("</DataCasamento>\n");

                String regimeBens = "";
                if (escritura.getRegimeBens() != null) {
                    regimeBens = escritura.getRegimeBens().getNome().toUpperCase();
                }

                texto.append("\t\t<RegimeBens>").append(regimeBens).append("</RegimeBens>\n");

                String quantidadeFilhosMaiores = "";

                if (escritura.getQuantidadeFilhosMaiores() != null) {
                    quantidadeFilhosMaiores = escritura.getQuantidadeFilhosMaiores().toString();
                }

                texto.append("\t\t<QuantidadeFilhosMaiores>").append(quantidadeFilhosMaiores).append("</QuantidadeFilhosMaiores>\n");

                String nomeParte = "";
                String tipoDocumento1 = "";
                String numero1 = "";
                String uf1 = "";
                String tipoDocumento2 = "";
                String numero2 = "";
                String dataNascimento = "";
                String localNascimentoPais = "";
                String localNascimentoUf = "";
                String localResidenciaPais = "";
                String localResidenciaUf = "";
                String localResidenciaMunicipio = "";
                String sexo = "";

                if (parte.getPessoa().getTipoPessoa() == TipoPessoa.FISICA) {

                    nomeParte = parte.getPessoa().getNome();

                    tipoDocumento1 = "CPF";
                    numero1 = Caracteres.removecaracter(parte.getPessoa().getCpf());

                    if (parte.getPessoa().getRg() != null && !parte.getPessoa().getRg().isEmpty()) {
                        tipoDocumento2 = "RG";
                        numero2 = Caracteres.removecaracter(parte.getPessoa().getRg());
                    }

                } else if (parte.getPessoa().getTipoPessoa() == TipoPessoa.JURIDICA) {

                    nomeParte = parte.getPessoa().getRazaoSocial();
                    tipoDocumento1 = "CNPJ";
                    numero1 = Caracteres.removecaracter(parte.getPessoa().getCnpj());


                } else if (parte.getPessoa().getTipoPessoa() == TipoPessoa.OAB) {

                    nomeParte = parte.getPessoa().getNome();
                    tipoDocumento1 = "OAB";
                    numero1 = Caracteres.removecaracter(parte.getPessoa().getOAB());
                    uf1 = parte.getPessoa().getUFOAB().getSigla();

                } else if (parte.getPessoa().getTipoPessoa() == TipoPessoa.OUTROS) {

                    nomeParte = parte.getPessoa().getNome();

                    tipoDocumento2 = "OUTROS";
                    numero2 = parte.getPessoa().getOutros();

                }

                if ((parte.getPessoa().getTipoPessoa() == TipoPessoa.FISICA) || (parte.getPessoa().getTipoPessoa() == TipoPessoa.OUTROS)) {

                    if (parte.getPessoa().getDataNascimento() != null) {
                        dataNascimento = dateFormat.format(parte.getPessoa().getDataNascimento());
                    }

                    if (parte.getPessoa().getEstadoNascimento() != null) {
                        localNascimentoPais = parte.getPessoa().getEstadoNascimento().getPais().getNome().toUpperCase();
                        localNascimentoUf = parte.getPessoa().getEstadoNascimento().getSigla();
                    }

                    if (parte.getPessoa().getCidadeResidencia() != null) {
                        localResidenciaPais = parte.getPessoa().getCidadeResidencia().getEstado().getPais().getNome().toUpperCase();
                        localResidenciaUf = parte.getPessoa().getCidadeResidencia().getEstado().getSigla();
                        localResidenciaMunicipio = parte.getPessoa().getCidadeResidencia().getCodigoIbge();
                    }

                    if (parte.getPessoa().getSexo() != null) {
                        sexo = parte.getPessoa().getSexo().getNome().substring(0, 1);
                    }

                }

                texto.append("\t\t<NomeParte>").append(nomeParte).append("</NomeParte>\n");

                texto.append("\t\t<Qualidade>").append(parte.getQualidade().getDescricao().toUpperCase()).append("</Qualidade>\n");

                texto.append("\t\t<TipoDocumento1>").append(tipoDocumento1).append("</TipoDocumento1>\n");

                texto.append("\t\t<Numero1>").append(numero1).append("</Numero1>\n");

                texto.append("\t\t<Uf1>").append(uf1).append("</Uf1>\n");

                texto.append("\t\t<TipoDocumento2>").append(tipoDocumento2).append("</TipoDocumento2>\n");

                texto.append("\t\t<Numero2>").append(numero2).append("</Numero2>\n");

                texto.append("\t\t<DataNascimento>").append(dataNascimento).append("</DataNascimento>\n");

                texto.append("\t\t<LocalNascimentoPais>").append(localNascimentoPais).append("</LocalNascimentoPais>\n");

                texto.append("\t\t<LocalNascimentoUf>").append(localNascimentoUf).append("</LocalNascimentoUf>\n");

                texto.append("\t\t<LocalResidenciaPais>").append(localResidenciaPais).append("</LocalResidenciaPais>\n");

                texto.append("\t\t<LocalResidenciaUf>").append(localResidenciaUf).append("</LocalResidenciaUf>\n");

                texto.append("\t\t<LocalResidenciaMunicipio>").append(localResidenciaMunicipio).append("</LocalResidenciaMunicipio>\n");

                texto.append("\t\t<Sexo>").append(sexo).append("</Sexo>\n");

                texto.append("\t</AtoCesdi>\n");
            }

        }

        texto.append("</NewDataSet>");

        file.write(texto.toString());

        reader.close();
        file.close();

    }
}